/*
这个 request.js 文件主要做了以下几件事：
配置了一个 axios 实例来发送 HTTP 请求。
对请求路径进行规范化处理。
针对不同的接口（是否需要认证）添加认证信息（Token）。
对响应数据进行处理，根据后端返回的 code 执行不同的逻辑（如成功、未登录、操作失败）。
对请求错误进行统一的处理和提示。
通过这种方式，所有的请求和响应都可以统一管理，提高了代码的可维护性和灵活性。
 */
//就是前后端API通信的统一入口
// request.js 做了一个 前端 API 管理器，作用是：
//
// 所有请求走一个 axios 实例（统一配置 baseURL/超时）。
//
// 请求前：自动判断接口是否需要 Token，并在 header 里加上。
//
// 响应后：统一处理后端的 code（成功 / 未登录 / 错误）。
//
// 出错时：统一提示错误信息，不需要每个页面都写重复逻辑。
import axios from 'axios';
//默认相当于引入了index.js文件
import router from '../router';
import { ElMessage } from 'element-plus';

// 1) 只创建一个 axios 实例，复用 baseURL/timeout
const instance = axios.create({
    //所有请求都默认走这个端口
    baseURL: 'http://localhost', // 后端在 80 端口
    timeout: 15000, //设置请求超时时间15秒
});
export default function request(options) {
    // 2) 规范化 path，用于白名单判断
    const rawUrl = options.url || '';
    let path = rawUrl;
    try {
        const u = new URL(rawUrl, window.location.origin);
        path = u.pathname;
    } catch (_) {}
    path = path.replace(/\/{2,}/g, '/').replace(/\/+$/, '');

    // 3) 登录/匿名接口白名单 不用带token
    const NO_AUTH_PATHS = ['/api/auth/login', '/api/auth/register', '/api/auth/captcha', '/public'];

    const isNoAuth = NO_AUTH_PATHS.some(p => path === p || path.startsWith(p + '/'));

    // 4) 只有非白名单接口才加 Authorization，并自动补 Bearer
    const headers = { ...(options.headers || {}) };
    if (!isNoAuth) {
        const tk = localStorage.getItem('token');
        if (tk) headers.Authorization = tk.startsWith('Bearer ') ? tk : `Bearer ${tk}`;
    }

    const finalOptions = {
        timeout: 15000,
        ...options,
        headers,
    };

    return instance(finalOptions)
        .then(res => res.data)
        .then(data => {
            console.log("1111")
            console.log('业务状态码:', data?.code);
            console.log('业务消息:', data?.msg);

            if (data?.code === 200) {
                if (data.msg) ElMessage.success(data.msg);
                return data.data;
            }

            if (data?.code === 401) {
                const msg = data.msg || '未登录';
                console.error('后端明确返回未登录:', msg);
                ElMessage.warning(msg);
                console.warn('[401 业务码]', (options.method || 'get').toUpperCase(), options.url);
                console.warn('[401 Authorization]', headers.Authorization || '(未设置)');

                if (!isNoAuth) {
                    localStorage.removeItem('token');
                    router.push('/login');
                }
                return Promise.reject(msg);
            }

            const msg = data?.msg || '操作失败';
            ElMessage.error(msg);
            return Promise.reject(msg);
        })
        .catch(error => {
            console.error(error)
            if (error?.response) {
                const { status, data } = error.response;
                ElMessage.error(data?.msg || `服务器错误（${status}）`);
            } else if (error?.request) {
                ElMessage.error('网络异常，请检查后端是否启动');
            } else {
                ElMessage.error(error?.message || '未知错误');
            }
            return Promise.reject(error);
        });
}
